package com.hongyi.web.controller;

import com.hongyi.result.Result;
import com.hongyi.web.dto.SysMenDto;
import com.hongyi.web.query.SysMenuQueryDto;
import com.hongyi.web.service.ISysMenuService;
import com.hongyi.web.utils.StringUtils;
import com.hongyi.web.vo.SysMenuVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author hongyi
 * @Date 2025/6/26 17:55
 */
@RestController
@RequestMapping("/system/menu")
public class SysMenuController {
    @Autowired
    private ISysMenuService menuService;

    /**
     * 获取菜单列表
     */
    @GetMapping("/selectSpage")
    public Result selectSpage(SysMenuQueryDto sysMenuDto)
    {
        List<SysMenuVo> menus = menuService.selectMenuList(sysMenuDto);
        return Result.success(menus);
    }

    /**
     * 根据菜单编号获取详细信息
     */
    @GetMapping(value = "/{menuId}")
    public Result getMenuById(@PathVariable Long menuId)
    {
        SysMenDto sysMenDto = menuService.selectMenuById(menuId);
        return Result.success(sysMenDto);
    }

    /**
     * 新增菜单
     */

    @PostMapping("/add")
    public Result add(@RequestBody SysMenDto sysMenDto)
    {
        if (!menuService.checkMenuNameUnique(sysMenDto))
        {
            return error2("新增菜单'" + sysMenDto.getMenuName() + "'失败，菜单名称已存在");
        }
        else if ("0".equals(sysMenDto.getIsFrame()) && !StringUtils.ishttp(sysMenDto.getPath()))
        {
            return error2("新增菜单'" + sysMenDto.getMenuName() + "'失败，地址必须以http(s)://开头");
        }
        menuService.insertMenu(sysMenDto);
        return Result.success("添加成功");
    }

    /**
     * 修改菜单
     */
    @PutMapping("/edit")
    public Result edit(@RequestBody SysMenDto sysMenDto)
    {
        if (!menuService.checkMenuNameUnique(sysMenDto))
        {
             return error2("修改菜单'" + sysMenDto.getMenuName() + "'失败，菜单名称已存在");
        }
        else if ("0".equals(sysMenDto.getIsFrame()) && !StringUtils.ishttp(sysMenDto.getPath())) // 菜单类型为外链且不是以http(s)://开头则返回错误
        {
            return error2("修改菜单'" + sysMenDto.getMenuName() + "'失败，地址必须以http(s)://开头");
        }
        else if (sysMenDto.getMenuId().equals(sysMenDto.getParentId()))
        {
            return error2("修改菜单'" + sysMenDto.getMenuName() + "'失败，上级菜单不能选择自己");
        }
        menuService.updateMenu(sysMenDto);
        return Result.success("修改成功");
    }


    public Result error2(String message) {
        return Result.error(message);
    }

    /**
     * 删除菜单
     */
    @DeleteMapping("/{menuId}")
    public Result remove(@PathVariable("menuId") Long menuId)
    {
        if (menuService.hasChildByMenuId(menuId))
        {
            return error2("存在子菜单,不允许删除");
        }
        if (menuService.checkMenuExistRole(menuId))
        {
            return error2("菜单已分配,不允许删除");
        }
        menuService.deleteMenuById(menuId);
        return Result.success("删除成功");
    }
}
